iT邦幫忙

2024 iThome 鐵人賽

1

在沒有行情的收盤或假日時段,也可以找點事情來做。 好比是回顧歷史,借古鑑今。 判斷一檔股票是否熱絡,可以直接從「交易量排行榜」很直觀地看出。 而去撈取交易量 “排行榜” 的功能,或許從現有的 API 可以湊出想要的功能但不好做。 所以本篇將說明如何去拿回公開資料,進行資料的蒐集。

https://ithelp.ithome.com.tw/upload/images/20241022/20130149SCvpewWEpw.png

Source Code

  • 寫一支程式來爬「成交量前二十名證券
  • 程式碼中有幾個設計簡單說明:
    1. 日期起始可以設定到最早從 start = date(2004, 2, 11) 開始,結束日期可以手動派,或是指定成今天。
    2. 因為從頁面中判斷下載檔案只是簡單的 HTTP GET 搭配日期與格式參數,所以用 strftime 產生想要的日期字串。
    3. 拉回來的檔案編碼是 cp950 換成 UTF-8 編碼。
    4. 下載間隔是必須的,拉太快可是會被暫時拒絕存取的。
      https://ithelp.ithome.com.tw/upload/images/20241022/20130149EhFSthAiUr.png

download_mi_index20.py

import time
import subprocess
from datetime import date, timedelta
from pathlib import Path

def download_mi_index20(start=None, end=None):
    if start is None:
        start = date(2004, 2, 11)
    if end is None:
        # end = date.today()
        end = date(2022, 12, 31)
    while start < end:
        # 根據年份產生目錄
        Path(start.strftime('%Y')).mkdir(parents=True, exist_ok=True)
        date_str = start.strftime('%Y%m%d')
        url_str = f'https://www.twse.com.tw/rwd/zh/afterTrading/MI_INDEX20?date={date_str}&response=csv'
        local_path = f'{start.strftime("%Y")}/{date_str}.csv'
        local_utf8_path = f'{start.strftime("%Y")}/{date_str}_utf8.csv'
        # 透過外部呼叫執行指令下載檔案
        subprocess.run(['wget', '-O', local_path, url_str])
        # 下載的檔案編碼轉換
        with open(local_path, 'r', encoding = 'cp950') as inF, open(local_utf8_path, 'w', encoding = 'UTF-8') as outF:
            outF.write(inF.read())
        time.sleep(5)
        start = start + timedelta(days=1)

結論

  • 拿回的資料,想要靈活運用以前,還需要進行些許處理。
    • 比方說過濾掉些我們用不到的字串。
    • 表格名稱也用不到。

上一篇
【Day 31】 在終端機介面中監控股價
系列文
從一萬元開始交易:收割韭菜三十天,量化交易工具製作32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言